package control;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import modelo.Concierto;
import modelo.Entrada;
import modelo.Usuario;
import persistencia.*;

@WebServlet(urlPatterns = {"/comprarEntradas"})
public class BuyTicketsServlet extends HttpServlet {

    //Recoge el concierto, la cantidad de entradas y el usuario identificado
    //Los recoge de la BD, y comprueba si hay disponibilidad y saldo
    //Si todo es correcto, lo añade a la BD e informa de lo ocurrido
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        
        String descConcierto = request.getParameter("cbConciertos");
        String cantidad = request.getParameter("cantidadEntradas");
        String username = (String) request.getSession().getAttribute("userName");
        boolean correcto = false;
        
        try
        {
            PersistenciaBD persistencia = PersistenciaBD.getInstance();
            Concierto conc = persistencia.getConcierto(descConcierto);
            Usuario user = persistencia.getClient(username);
            
            if (conc.getDisponible()>0)
            {
                if (conc.getDisponible()>=Integer.parseInt(cantidad))
                {
                    if (user.getCredito()>=(conc.getPrecio()*Integer.parseInt(cantidad)))
                    {
                        Entrada entrada = new Entrada(user, conc, descConcierto, conc.getFecha(), conc.getPrecio());
                        for (int i=0;i<Integer.parseInt(cantidad);i++){
                            if (persistencia.addEntrada(entrada))
                            {
                                user.setCredito(user.getCredito()-conc.getPrecio());
                                conc.setDisponible(conc.getDisponible()-1);
                                if (persistencia.completarCompra(user, conc)){
                                    request.setAttribute("concierto", conc);
                                    request.setAttribute("entrada", entrada);
                                    request.setAttribute("cantidad", cantidad);
                                    correcto = true;
                                    request.setAttribute("mensaje", "Entrada comprada correctamente");
                                    request.getRequestDispatcher("visualizarEntrada.jsp").forward(request, response);
                                }
                                else{
                                    correcto = false;
                                    request.setAttribute("mensaje", "Error al completar la compra");
                                }
                            }
                            else{
                                correcto = false;
                                request.setAttribute("mensaje", "Error al comprar la entrada");
                            }
                        }
                    }
                    else{
                        correcto = false;
                        request.setAttribute("mensaje", "Saldo insuficiente");
                    }
                }
                else{
                    correcto = false;
                    request.setAttribute("mensaje", "Solo disponemos de "+conc.getDisponible()+" entradas"); 
                }         
            }
            else{
                correcto = false;
                request.setAttribute("mensaje", "Entradas agotadas");
            }
        } 
        catch (NumberFormatException e)
        {
            correcto = false;
            request.setAttribute("mensaje", "Fallo al añadir el credito");
        }
        if (correcto)
            request.getRequestDispatcher("visualizarEntrada.jsp").forward(request, response);
        else
            request.getRequestDispatcher("/cargarConciertos?tipo=comprar").forward(request, response);
    }
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    public String getServletInfo() {
        return "Servlet para comprar entradas";
    }
}